package trim.scripting.engine;

import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Reader;
import trim.scripting.interfaces.IExportManager;
import trim.scripting.interfaces.IImportData;
import trim.scripting.interfaces.IPlaginManager;
import trim.scripting.interfaces.IResultListManager;
import trim.scripting.interfaces.IStateWindow;
import trim.scripting.interfaces.ITestGenerator;
import trim.scripting.utils.ReaderInputStream;

/**
 * GroovyScriptEngine.java
 *
 * Реализация {@link IScriptEngine} для Groovy
 *
 * @author Podorov Alexander
 */
public class GroovyScriptEngine implements IScriptEngine
{

  /**
   * Запуск скрипта на выполнение
   *
   * @param data - исходные данные
   * @param exportManager - менеджер экспорта данных
   * @param importData - менеджер импорта данных
   * @param resultListManager - менеджер отображения решений
   * @param stateWindow - статусное окно
   * @param testGenerator - генератор тестов
   * @throws ScriptException
   */
  private void runAll(Object data,IExportManager exportManager,
    IImportData importData,IResultListManager resultListManager,
    IStateWindow stateWindow,IPlaginManager pm) throws ScriptException
  {
    try
    {
      Binding binding=new Binding();

      binding.setVariable("exportManager",exportManager);
      binding.setVariable("inputData",importData.getInputData());
      binding.setVariable("resultListManager",resultListManager);
      binding.setVariable("stateWindow",stateWindow);
      binding.setVariable("testGenerator",importData.getTestGenerator());
      binding.setVariable("console",System.out);
      binding.setVariable("plaginManager",pm);

      GroovyShell shell=new GroovyShell(binding);

      Script script=null;
      if(data instanceof String)
      {
        script=shell.parse((String)data);
      }
      if(data instanceof InputStream)
      {
        script=shell.parse((InputStream)data);
      }
      if(data instanceof File)
      {

        script=shell.parse(new FileInputStream((File)data));

      }
      if(data instanceof Reader)
      {
        script=shell.parse(new ReaderInputStream((Reader)data));
      }

      script.run();
    }catch(Exception ex)
    {
      throw new ScriptException(ex.getMessage(),ex);
    }
  }

  /**
   * Запуск скрипта на выполнение
   *
   * @param code - исходный код скрипта
   * @param exportManager - менеджер экспорта данных
   * @param importData - менеджер импорта данных
   * @param resultListManager - менеджер отображения решений
   * @param stateWindow - статусное окно
   * @param testGenerator - генератор тестов
   * @throws ScriptException
   */
  public void run(String code,IExportManager exportManager,IImportData importData,
    IResultListManager resultListManager,IStateWindow stateWindow,IPlaginManager pm) throws ScriptException
  {
    runAll(code,exportManager,importData,resultListManager,stateWindow,pm);
  }

  /**
   * Запуск скрипта на выполнение
   *
   * @param inputStream - байтовый входной поток, последовательная передача исходного кода скрипта
   * @param exportManager - менеджер экспорта данных
   * @param importData - менеджер импорта данных
   * @param resultListManager - менеджер отображения решений
   * @param stateWindow - статусное окно
   * @param testGenerator - генератор тестов
   * @throws ScriptException
   */
  public void run(InputStream inputStream,IExportManager exportManager,IImportData importData,
    IResultListManager resultListManager,IStateWindow stateWindow,IPlaginManager pm) throws ScriptException
  {
    runAll(inputStream,exportManager,importData,resultListManager,stateWindow,pm);
  }

  /**
   * Запуск скрипта на выполнение
   *
   * @param file - файл с исходным кодом скрипта
   * @param exportManager - менеджер экспорта данных
   * @param importData - менеджер импорта данных
   * @param resultListManager - менеджер отображения решений
   * @param stateWindow - статусное окно
   * @param testGenerator - генератор тестов
   * @throws ScriptException
   */
  public void run(File file,IExportManager exportManager,IImportData importData,
    IResultListManager resultListManager,IStateWindow stateWindow,IPlaginManager pm) throws ScriptException
  {
    runAll(file,exportManager,importData,resultListManager,stateWindow,pm);
  }

  /**
   * Запуск скрипта на выполнение
   *
   * @param reader - символьный входной поток, последовательная передача исходного кода скрипта
   * @param exportManager - менеджер экспорта данных
   * @param importData - менеджер импорта данных
   * @param resultListManager - менеджер отображения решений
   * @param stateWindow - статусное окно
   * @param testGenerator - генератор тестов
   * @throws ScriptException
   */
  public void run(Reader reader,IExportManager exportManager,IImportData importData,
    IResultListManager resultListManager,IStateWindow stateWindow,IPlaginManager pm) throws ScriptException
  {
    runAll(reader,exportManager,importData,resultListManager,stateWindow,pm);
  }
}
